package aboutInherit

/**
  * 这个文件用来说明重写val类型可能会带来的问题
  */
class Creature {

  val range:Int = 10
  val env:Array[Int] = new Array[Int](range)
}

class Ant extends Creature{
  override val range:Int = 2
}

object TestCreature{
  def main(args: Array[String]) {
    val ant = new Ant
    /** 这里输出2没有问题 */
    println(ant.range)

    /**
      * 这里输出是0,以下说明继承关系中重写val在构造器中的执行顺序
      * 1.Ant构造器在做它自己的构造之前,调用Creature的构造器.
      * 2.Creature构造器将它的range字段设为10.
      * 3.Creature的构造器为了初始化env数组,调用range()
      * 4.该方法被重写以输出(还未被初始化的)Ant类的range字段值.
      * 5.range方法返回0.(这是对象被分配空间时所有整型字段的初始值)
      * 6.env被设为长度为0的数组.
      * 7.Ant构造器继续执行,将其range字段设置为2.
      * 这里的教训是,在构造器中,尽量不要依赖val的值构造别的val.
      * 解决方法:class Ant{override val range = 2} with Creature,这样range就会在Creature的构造器之前执行,
      * 但是这样写很丑
      */
    println(ant.env.length)
  }
}